﻿using System;
using System.Collections.Generic;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading;

namespace ConsoleApp2
{
    //定义委托 （由此可见，委托是一种类型（类））
    public delegate int Mydelegate(int i, int x);

    public class DelegateClass
    {
        public void Show()
        {
            //声明委托
            Mydelegate mydelegate = new Mydelegate(Test1);
            mydelegate.Invoke(1, 1);//会开始调用，打印i+x=2
            mydelegate(1, 2);//会开始调用，打印i+x=2  缩写版

            //也可以异步调用（由此可见多线程基于委托）
            var iar = mydelegate.BeginInvoke(1, 3, null, null);//马上开子线程执行，并返回IAsyncResult。想要结果，必须等待。


            //mydelegate.EndInvoke(iar);//这句话的注释是有区别的,这句话是线程等待。

            //var ar = (AsyncResult)iar;                   //获取结果的技俩
            //Mydelegate a = (Mydelegate)ar.AsyncDelegate; //获取结果的技俩
            //var result = a.EndInvoke(iar);               //获取结果的技俩

            //var result2 = mydelegate.EndInvoke(iar);       //获取结果的技俩。

            Console.WriteLine("到了这里了");
        }

        private int Test1(int i, int x)
        {
            Thread.Sleep(1000);//休息1秒钟
            Console.WriteLine($"i+x={i + x}");
            return i + x;
        }
    }
}
